package com.atguigu.springcloud.cfgbeans;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class ConfigBean {

    /**
     * 这个客户端去调用微服务提供者时，需要通过Ribbon进行负载均衡调用：
     *
     * 之前没加这个@LoadBalanced注解，直接通过RestTemplate去调用微服务提供者时，是直接调用的微服务提供者，即，微服务的调用地址是写死在
     * DeptController_Consumer这个类中的，如果现在微服务提供者有多个，这样写死在代码中就只会调用其中一个微服务，达不到负载均衡的目的。
     *
     * 现在我们使用Ribbon来做客户端的负载均衡，即，当微服务的消费方去调用微服务(提供方)时，不是直接去找某一个微服务（不是把微服务的调用地址
     * 写死在微服务的消费方的代码中），而是先在Eureka注册中心中根据某种负载均衡算法(轮询、随机等)从Eureka注册中心找出一个最符合的微服务，
     * 然后再去调用这个微服务。
     *
     * Ribbon已经和Eureka进行了整合，我们在使用Ribbon的时候有如下几个步骤：
     * 1. 在这个微服务的消费方的pom文件中引入如下三个依赖(Ribbon所需的三个依赖)
     *  <!-- Ribbon相关 -->
     *     <dependency>
     *         <groupId>org.springframework.cloud</groupId>
     *         <artifactId>spring-cloud-starter-eureka</artifactId>
     *     </dependency>
     *     <dependency>
     *         <groupId>org.springframework.cloud</groupId>
     *         <artifactId>spring-cloud-starter-ribbon</artifactId>
     *     </dependency>
     *     <dependency>
     *         <groupId>org.springframework.cloud</groupId>
     *         <artifactId>spring-cloud-starter-config</artifactId>
     *     </dependency>
     *
     *  2. 在微服务的消费方的配置文件application.yml中写上注册中心的信息，如下：
     *  eureka:
     *   client:
     *     register-with-eureka: false
     *     service-url:
     *       defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
     *
     *  3. 在RestTemplate组件上标注@LoadBalance注解，启用Ribbon的负载均衡机制
     *  4. 在主启动类上标注@EnableEurekaClient
     * @return
     */
    @Bean
    @LoadBalanced  // Ribbon的默认负载均衡机制是轮询
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}
